Skip to content

9.7 更新操作

📝 模块更新日志 新特性*

+ 新增 `EFCore` 批量更新支持设置 `includePropertyNames` 和 `excludePropertyNames` 参数 4\.9\.2\.28 ⏱️2024\.04\.23 [c9926cc](https://gitee.com/dotnetchina/Furion/commit/c9926ccb6434316338816eaf259ae9191f40505e)
  • 问题修复

    • 修复 EFCore 执行更新操作时可能出现 DbUpdateConcurrencyException 异常问题 4.9.5.7 ⏱️2024.09.07 @Roc.Lee !885 a4db240

功能移除声明以下内容包含 Exists 单词的在 Furion 2.6.0 + 版本中已移除。

9.7.1 更新全部列(不立即提交)

// ==== 同步操作 ====  

// 示例一  
repository.Update(user);  

// 示例二  
user.Update();  

// 示例三  
repository.ChangeEntityState(user, EntityState.Modified);  

// 示例四  
repository.Entities.Update(user);  

// ==== 异步操作 ====  

// 示例一  
await repository.UpdateAsync(user);  

// 示例二  
await user.UpdateAsync();  

9.7.2 更新全部列(立即提交)

// ==== 同步操作 ====  

// 示例一  
repository.UpdateNow(user);  

// 示例二  
user.UpdateNow();  

// ==== 异步操作 ====  

// 示例一  
await repository.UpdateNowAsync(user);  

// 示例二  
await user.UpdateNowAsync();  

9.7.3 更新部分列(不立即提交)

// ==== 同步操作 ====  

// 示例一  
repository.UpdateInclude(user, new[] {"Age", "Name"});  

// 示例二  
repository.UpdateInclude(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
repository.UpdateInclude(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// 示例四  
user.UpdateInclude(new[] {"Age", "Name"});  

// 示例五  
user.UpdateInclude(new[] {nameof(User.Name), nameof(User.Age)});  

// 示例六  
user.UpdateInclude(new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  


// ==== 异步操作 ====  

// 示例一  
await repository.UpdateIncludeAsync(user, new[] {"Age", "Name"});  

// 示例二  
await repository.UpdateIncludeAsync(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
await repository.UpdateIncludeAsync(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// 示例四  
await user.UpdateIncludeAsync(new[] {"Age", "Name"});  

// 示例五  
await user.UpdateIncludeAsync(new[] {nameof(User.Name), nameof(User.Age)});  

// 示例六  
await user.UpdateIncludeAsync(new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

9.7.4 更新部分列(立即提交)

// ==== 同步操作 ====  

// 示例一  
repository.UpdateIncludeNow(user, new[] {"Age", "Name"});  

// 示例二  
repository.UpdateIncludeNow(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
repository.UpdateIncludeNow(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// 示例四  
user.UpdateIncludeNow(new[] {"Age", "Name"});  

// 示例五  
user.UpdateIncludeNow(new[] {nameof(User.Name), nameof(User.Age)});  

// 示例六  
user.UpdateInclude(new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  


// ==== 异步操作 ====  

// 示例一  
await repository.UpdateIncludeNowAsync(user, new[] {"Age", "Name"});  

// 示例二  
await repository.UpdateIncludeNowAsync(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
await repository.UpdateIncludeNowAsync(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// 示例四  
await user.UpdateIncludeNowAsync(new[] {"Age", "Name"});  

// 示例五  
await user.UpdateIncludeNowAsync(new[] {nameof(User.Name), nameof(User.Age)});  

// 示例六  
await user.UpdateIncludeNowAsync(new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

9.7.5 排除特定列更新(不立即提交)

// ==== 同步操作 ====  

// 示例一  
repository.UpdateExclude(user, new[] {"Age", "Name"});  

// 示例二  
repository.UpdateExclude(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
repository.UpdateExclude(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// 示例四  
user.UpdateExclude(new[] {"Age", "Name"});  

// 示例五  
user.UpdateExclude(new[] {nameof(User.Name), nameof(User.Age)});  

// 示例六  
user.UpdateExclude(new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  


// ==== 异步操作 ====  

// 示例一  
await repository.UpdateExcludeAsync(user, new[] {"Age", "Name"});  

// 示例二  
await repository.UpdateExcludeAsync(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
await repository.UpdateExcludeAsync(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// 示例四  
await user.UpdateExcludeAsync(new[] {"Age", "Name"});  

// 示例五  
await user.UpdateExcludeAsync(new[] {nameof(User.Name), nameof(User.Age)});  

// 示例六  
await user.UpdateExcludeAsync(new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

9.7.6 排除特定列更新(立即提交)

// ==== 同步操作 ====  

// 示例一  
repository.UpdateExcludeNow(user, new[] {"Age", "Name"});  

// 示例二  
repository.UpdateExcludeNow(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
repository.UpdateExcludeNow(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// 示例四  
user.UpdateExcludeNow(new[] {"Age", "Name"});  

// 示例五  
user.UpdateExcludeNow(new[] {nameof(User.Name), nameof(User.Age)});  

// 示例六  
user.UpdateExcludeNow(new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  


// ==== 异步操作 ====  

// 示例一  
await repository.UpdateExcludeNowAsync(user, new[] {"Age", "Name"});  

// 示例二  
await repository.UpdateExcludeNowAsync(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
await repository.UpdateExcludeNowAsync(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// 示例四  
await user.UpdateExcludeNowAsync(new[] {"Age", "Name"});  

// 示例五  
await user.UpdateExcludeNowAsync(new[] {nameof(User.Name), nameof(User.Age)});  

// 示例六  
await user.UpdateExcludeNowAsync(new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

9.7.7 数据存在才更新所有列(不立即提交)

功能移除声明以下内容已在 Furion 2.6.0 + 版本移除。

// ==== 同步操作 ====  

// 示例一  
repository.UpdateExists(user);  

// ==== 异步操作 ====  

// 示例一  
await repository.UpdateExistsAsync(user);  

9.7.8 数据存在才更新所有列(立即提交)

功能移除声明以下内容已在 Furion 2.6.0 + 版本移除。

// ==== 同步操作 ====  

// 示例一  
repository.UpdateExistsNow(user);  

// ==== 异步操作 ====  

// 示例一  
await repository.UpdateExistsNowAsync(user);  

9.7.9 数据存在才更新部分列(不立即提交)

功能移除声明以下内容已在 Furion 2.6.0 + 版本移除。

// ==== 同步操作 ====  

// 示例一  
repository.UpdateIncludeExists(user, new[] {"Age", "Name"});  

// 示例二  
repository.UpdateIncludeExists(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
repository.UpdateIncludeExists(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// ==== 异步操作 ====  

// 示例一  
await repository.UpdateIncludeExistsAsync(user, new[] {"Age", "Name"});  

// 示例二  
await repository.UpdateIncludeExistsAsync(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
await repository.UpdateIncludeExistsAsync(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

9.7.10 数据存在才更新部分列(立即提交)

功能移除声明以下内容已在 Furion 2.6.0 + 版本移除。

// ==== 同步操作 ====  

// 示例一  
repository.UpdateIncludeExistsNow(user, new[] {"Age", "Name"});  

// 示例二  
repository.UpdateIncludeExistsNow(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
repository.UpdateIncludeExistsNow(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// ==== 异步操作 ====  

// 示例一  
await repository.UpdateIncludeExistsNowAsync(user, new[] {"Age", "Name"});  

// 示例二  
await repository.UpdateIncludeExistsNowAsync(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
await repository.UpdateIncludeExistsNowAsync(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

9.7.11 数据存在才排除特定部分列更新(不立即提交)

功能移除声明以下内容已在 Furion 2.6.0 + 版本移除。

// ==== 同步操作 ====  

// 示例一  
repository.UpdateExcludeExists(user, new[] {"Age", "Name"});  

// 示例二  
repository.UpdateExcludeExists(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
repository.UpdateExcludeExists(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// ==== 异步操作 ====  

// 示例一  
await repository.UpdateExcludeExistsAsync(user, new[] {"Age", "Name"});  

// 示例二  
await repository.UpdateExcludeExistsAsync(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
await repository.UpdateExcludeExistsAsync(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

9.7.12 数据存在才排除特定部分列更新(立即提交)

功能移除声明以下内容已在 Furion 2.6.0 + 版本移除。

// ==== 同步操作 ====  

// 示例一  
repository.UpdateExcludeExistsNow(user, new[] {"Age", "Name"});  

// 示例二  
repository.UpdateExcludeExistsNow(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
repository.UpdateExcludeExistsNow(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

// ==== 异步操作 ====  

// 示例一  
await repository.UpdateExcludeExistsNowAsync(user, new[] {"Age", "Name"});  

// 示例二  
await repository.UpdateExcludeExistsNowAsync(user, new[] {nameof(User.Name), nameof(User.Age)});  

// 示例三  
await repository.UpdateExcludeExistsNowAsync(user, new[] {nameof(User.Name), nameof(User.Age)}, true);  // 忽略空值  

9.7.13 更新多条记录(不立即提交)

// ==== 同步操作 ====  

// 示例一  
repository.Update(user, user2);  

// 示例二  
repository.Update(new List<User> { user, user2 });  

// 示例三  
repository.Update(new[] {user, user2 });  

// ==== 异步操作 ====  

// 示例一  
await repository.UpdateAsync(user, user2);  

// 示例二  
await repository.UpdateAsync(new List<User> { user, user2 });  

// 示例三  
await repository.UpdateAsync(new[] {user, user2 });  

9.7.14 更新多条记录(立即提交)

// ==== 同步操作 ====  

// 示例一  
repository.UpdateNow(user, user2);  

// 示例二  
repository.UpdateNow(new List<User> { user, user2 });  

// 示例三  
repository.UpdateNow(new[] {user, user2 });  

// ==== 异步操作 ====  

// 示例一  
await repository.UpdateNowAsync(user, user2);  

// 示例二  
await repository.UpdateNowAsync(new List<User> { user, user2 });  

// 示例三  
await repository.UpdateNowAsync(new[] {user, user2 });  

小知识所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.7.15 忽略空值更新

默认情况下,EFCore 更新会更新全部列(除实体跟踪方式以外),有些时候我们希望 Null 值无需更新,这是我们只需要在更新时候配置 ignoreNullValues 参数即可,如:

repository.Update(entity, ignoreNullValues: true);  

也可以全局配置,在 AppDbContext 的派生类的构造函数中启用即可:

using Furion.DatabaseAccessor;  
using Microsoft.EntityFrameworkCore;  

namespace Furion.EntityFramework.Core  
{  
    [AppDbContext("Sqlite3ConnectionString", DbProvider.Sqlite)]  
    public class DefaultDbContext : AppDbContext<DefaultDbContext>  
    {  
        public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)  
        {  
            InsertOrUpdateIgnoreNullValues = true;  
        }  
    }  
}  

9.7.16 批量更新包含或排除列 ✨

版本说明以下内容仅限 Furion 4.9.2.28 + 版本使用。

var entities = new List<Person> { ... };    

// 更新指定列    
repository.Update(entities, includePropertyNames: new string[] { nameof(Person.Name), nameof(Person.Age) });    

// 或者排除指定列    
repository.Update(entities, excludePropertyNames: new string[] { nameof(Person.Address) });  

9.7.17 反馈与建议

与我们交流给 Furion 提 Issue